#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
     setWindowTitle("TCP - 客户端上传文件");
    //创建通信的套接字对象
    ui->ip->setText("127.0.0.1");
    m_tcp = new QTcpSocket(this);
    ui->close->setEnabled(false);
    //检测是否和服务器连接成功
    connect(m_tcp,&QTcpSocket::connected,this,[=]()
            {
                //ui->rec->append("恭喜，服务器连接成功!");
                ui->status->setText("已连接");
                ui->connect->setEnabled(false);
                ui->close->setEnabled(true);
            });
    //检测服务器是都恢复了数据
    //    connect(m_tcp,&QTcpSocket::readyRead,[=]()
    //    {
    //        QByteArray recvMsg = m_tcp->readAll();
    //        ui->rec->append("服务器say:"+recvMsg);
    //        ui->rec->setAlignment(Qt::AlignRight);
    //    });
    //检测服务器是否断开了连接
    connect(m_tcp,&QTcpSocket::disconnected,this,[=]()
            {
                //ui->rec->append("服务器已经断开了连接");
                ui->status->setText("未连接");
                ui->connect->setEnabled(true);
                ui->close->setEnabled(false);
            });
    myTimer = new QTimer(this);
    connect(myTimer,&QTimer::timeout,this,[&]()
            {
                myTimer->stop(); //关闭定时器
                qint64 sendSize =0;
                qint64 len;
                do{
                    char buf[4*1024] = {0};
                    len = file.read(buf,sizeof(buf)); //每次读取的空间
                    m_tcp->write(buf,len); //读取的文件缓冲区放到buf里面
                    sendSize +=len;
                    ui->progressBar->setValue(sendSize / 1024);
                }while(len >0);

                if(sendSize == filesize)
                {
                    qDebug()<<"文件发送成功";
                    file.close();
                    m_tcp->disconnectFromHost();
                    m_tcp->close();
                }

            });

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_connect_clicked()
{
    QString ip = ui->ip->text();
    unsigned short port = ui->port->text().toInt();
    //连接服务器
    m_tcp->connectToHost(ip,port);
}


void MainWindow::on_close_clicked()
{
    m_tcp->close();
    ui->connect->setEnabled(true);
    ui->close->setEnabled(false);
}


void MainWindow::on_open_clicked()
{
    QString filepath = QFileDialog::getOpenFileName(this);
    //同时发送文件名称和文件大小
    QFileInfo FileData(filepath);
    filename = FileData.fileName(); //文件名称
    filesize = FileData.size(); //文件大小
    qDebug()<<"文件名"<<filename <<"  文件大小:"<<filesize;

    if(!filepath.isEmpty())
    {
        ui->path->setText(filepath);
        ui->file->setText(filename);
        file.setFileName(filepath); //设置文件
        file.open(QIODevice::ReadOnly);//只读的方式打开文件
    }
    //设置传输的进度条
    ui->progressBar->setMinimum(0);
    ui->progressBar->setMaximum(filesize / 1024);
    ui->progressBar->setValue(0);  //设置当前值为0

}


void MainWindow::on_send_clicked()
{
    //点击 开始之后，发送数据，先发送头名称和大小
    // 文件名**文件大小
    QString head = filename + "**" + QString::number(filesize);
    qint64 length  = m_tcp->write(head.toUtf8()); //将头文件发送过去
    if(length > 0)
    {
        qDebug()<<length;
        //发送成功
        myTimer->start(20); //20毫秒之后再发，避免粘包
    }
    else
    {
        //发送失败
        file.close();//关闭文件
    }
}

